package com.algernoon.nettydemo.p_async.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TimeServer {

	/**
	 * 1.通过线程池和任务队列实现一种伪异步的I/O通信框架
	 * 2.当新的客户端请求接入时，将客户端的Socket封装成一个Task(实现Runable接口)投递给后端的线程池处理，
	 * JDK的线程池维护一个消息队列和N个活跃的线程对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小
	 * 和最大线程数，因此，他的资源占用是可控的，无论多少个客户端并发访问都不会导致资源的耗尽和宕机。
	 * 
	 * @param args
	 */

	// 通过线程池优化的伪异步IO服务
	public static void main(String[] args) {

		int port = 8080;
		if (args != null && args.length > 0) {
			try {
				port = Integer.valueOf(port);
			} catch (NumberFormatException e) {
				e.printStackTrace();
			}
		}

		ServerSocket server = null;
		try {
			server = new ServerSocket(port);
			System.out.println("The time server is started in port: " + port);
			Socket socket = null;
			// 创建I/O任务线程池
			// 当接收新的客户端连接请求的时候，将请求Socket封装成一个Task，然后调用线程池的execute方法执行，从而避免每个请求都创建一个新的线程
			TimeServerHandlerExecutePool singleExecutor = new TimeServerHandlerExecutePool(50, 10000);

			while (true) {
				socket = server.accept();
				singleExecutor.execute(new TimeServerHandler(socket));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (server != null) {
				try {
					System.out.println("The time server is closing...");
					server.close();
					server = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
